package org.mspring.mlog.search.engine;

import java.util.List;

import org.apache.lucene.search.Query;
import org.mspring.mlog.search.Searchable;
import org.mspring.platform.dao.support.Page;

/**
 * 索引引擎实现构建索引.删除索引.更新索引.检索等操作.
 * 
 * @author Gao Youbo
 * @since 2013年8月2日
 */
public interface SearchEngine {

    /**
     * 创建索引
     * 
     * @param searchables
     * @throws Exception
     */
    public void doIndex(Searchable... searchables) throws Exception;

    /**
     * 创建索引(考虑线程安全)
     * 
     * @param searchables
     *            对象
     * @throws Exception
     */
    public void doIndex(List<? extends Searchable> searchables) throws Exception;

    /**
     * 删除索引
     * 
     * @param bean
     *            对象
     * @throws Exception
     */
    public void deleteIndex(Searchable... beans) throws Exception;

    /**
     * 删除索引(删除多个)
     * 
     * @param beans
     *            对象
     * @throws Exception
     */
    public void deleteIndexs(List<? extends Searchable> beans) throws Exception;

    /**
     * 更新索引
     * 
     * @param searchables
     *            需要更新的bean
     * @throws Exception
     */
    public void updateIndex(Searchable... searchables) throws Exception;

    /**
     * 批量更新索引
     * 
     * @param searchables
     *            需要更新的beans
     * @throws Exception
     */
    public void updateIndexs(List<? extends Searchable> searchables) throws Exception;

    /**
     * 索引优化
     * 
     * @param clazz
     * @throws Exception
     */
    public void optimize(Class<? extends Searchable> clazz) throws Exception;

    /**
     * 进行检索
     * 
     * @param clazz
     *            检索对象
     * @param keyword
     *            关键字
     * @param fields
     *            检索字段
     * @param isHighlighter
     *            是否高亮
     * @param page
     *            分页参数
     * @return
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public Page doSearch(Class<? extends Searchable> clazz, String keyword, String[] fields, boolean isHighlighter, Page page) throws Exception;

    /**
     * 进行检索
     * 
     * @param clazz
     *            检索对象
     * @param query
     *            查询对象
     * @param isHighlighter
     *            是否高亮关键字
     * @param page
     *            分页参数
     * @return
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public Page doSearch(Class<? extends Searchable> clazz, Query query, boolean isHighlighter, Page page) throws Exception;

    /**
     * 进行多个检索对象的检索
     * 
     * @param clazz
     *            多个检索对象
     * @param keyword
     *            关键字
     * @param fields
     *            检索字段
     * @param isHighlighter
     *            是否高亮
     * @param page
     *            分页参数
     * @return
     * @throws Exception
     */
    public Page doSearch(List<Class<? extends Searchable>> classes, String keyword, String[] fields, boolean isHighlighter, Page page) throws Exception;

    /**
     * 统计记录数量
     * 
     * @param clazz
     * @param query
     * @return
     * @throws Exception
     */
    public Long count(Class<? extends Searchable> clazz, Query query) throws Exception;

    /**
     * 统计记录数量
     * 
     * @param classes
     * @param keyword
     * @param fields
     * @return
     */
    public Long count(List<Class<? extends Searchable>> classes, String keyword, String[] fields) throws Exception;
}
